#ifndef QLSCORESYSTEM_H
#define QLSCORESYSTEM_H

#include <QMouseEvent>
#include <QHBoxLayout>
#include <QMutex>
#include <QShowEvent>

#include <QWidget>

#include <db_manager/service/user_service.h>
#include <plugins_manager/qls_plugins_manager.h>

#define IsBorderLess 1 /* 是否隐藏边框 */
#define IsShadow     1 /* 是否显示阴影 */
#define AUTO_ScaleUI 0 /* 是否自动适应系统缩放 */

QT_BEGIN_NAMESPACE
namespace Ui {
class QLsCoreSystem;
}
QT_END_NAMESPACE

class QLsCoreSystem : public QWidget
{
    Q_OBJECT

public:
    QLsCoreSystem(QWidget *parent = nullptr);
    ~QLsCoreSystem();

signals:
    /* 加载插件信号 */
    void sigLoad(PluginInfo &);

public slots:
    /* 登录的槽函数 */
    void slotLogin(const User &user);
#if AUTO_ScaleUI
    /* windows缩放(每英寸逻辑点)的变化 的槽函数 */
    void onLogicalDotsPerInchChanged(qreal dpi);
#endif

protected:
#if IsBorderLess
    /* 鼠标事件重载 - 移动事件 */
    void mouseMoveEvent(QMouseEvent *event);
    /* 鼠标事件重载 - 按下事件 */
    void mousePressEvent(QMouseEvent *event);
    /* 鼠标事件重载 - 释放事件 */
    void mouseReleaseEvent(QMouseEvent *event);
#endif
    /* 事件过滤器 */
    bool eventFilter(QObject *target, QEvent *event);
    /* 绘图事件重载 */
    void paintEvent(QPaintEvent *event);

private:
    /* 主界面初始化 */
    void HomeInit();
    /* 设置初始化 */
    void SetInit();
#if AUTO_ScaleUI
    /* 缩放UI */
    int ScaleUI(int spec);
    /* 根据缩放设置尺寸 */
    void SetSizeWithScale(const QObject &o);
#endif

private slots:
    /* 最大化/还原窗口 */
    void on_maxiBtn_clicked();
    /* 设置主题二级菜单的槽函数 */
    void slotSetThemesActionsTriggered();
    /* 插件管理二级菜单的槽函数 */
    void slotPluginManagerActionsTriggered();
    /* 日志输出到控件 */
    void slotWriteLog(const QString &message, int level);
    /* 切换语言二级菜单的槽函数 */
    void slotChangeLanguageActionsTriggered();
    /* 日志表格右键弹出菜单的槽函数 */
    void on_recordTableWidget_customContextMenuRequested(const QPoint &pos);
    /* 日志表格右键菜单消息处理的槽函数 */
    void slotRecordActionDeal();
    /* 加载、卸载插件的槽函数 */
    void slotPluginLoad(PluginInfo &pluginInfo);

private:
    Ui::QLsCoreSystem *ui;

    User me;

    /* 窗口数据，无边框移动、缩放 */
#if IsBorderLess
    bool m_bSize;         /* 能否缩放 */
    bool m_bMove;         /* 能否移动 */
    bool m_bSizeOrMove;   /* 缩放: true; 移动: false; */
    QPoint m_PointWindow; /* 鼠标左键按下位置 */
    bool m_bPress;        /* 鼠标左键是否按下 */

#endif

#if AUTO_ScaleUI
    /* 适应Windows缩放百分比 */
    double m_preRate;
    double m_scaleFromPreRate;
#endif

    QString m_curThemeName; /* 当前主题名 */
    QString m_curLangPack;  /* 当前语言包名 */

    QMutex m_recordTableWidgetMutex; /* recordTableWidget互斥锁 */
};
#endif // QLSCORESYSTEM_H
